#include "global.h"

// 定义8个按钮的结构体实例
static struct Button btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8;

// 按钮1的按下事件处理函数
void btn1_pressDownHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    txRemote.aux1 = 2000;
}
// 按钮1的抬起事件处理函数
void btn1_pressUpHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    txRemote.aux1 = 1000;
}

// 按钮2的按下事件处理函数
void btn2_pressDownHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    txRemote.aux2 = 2000;
}
// 按钮2的抬起事件处理函数
void btn2_pressUpHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    txRemote.aux2 = 1000;
}

// 按钮3的单击事件处理函数
void btn3_singleClickHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    // 切换txRemote.aux3的值在1000和2000之间
    if (txRemote.aux3 == 1000)
    {
        txRemote.aux3 = 2000;
    }
    else
    {
        txRemote.aux3 = 1000;
    }
}

// 按钮4的单击事件处理函数
void btn4_singleClickHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    // 切换txRemote.aux4的值在1000和2000之间
    if (txRemote.aux4 == 1000)
    {
        txRemote.aux4 = 2000;
    }
    else
    {
        txRemote.aux4 = 1000;
    }
}

// 按钮5的单击事件处理函数
void btn5_singleClickHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    // 如果txRemoteOffset.roll大于-250，则减少5
    if (txRemoteOffset.roll > -250)
    {
        txRemoteOffset.roll -= 5;
        // 将新的roll值写入AT24C02 EEPROM
        at24c02_writePage(AT24C02ADDR_ROLL_OFFSET, (uint8_t *)&txRemoteOffset.roll, 2);
    }
}

// 按钮6的单击事件处理函数
void btn6_singleClickHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    // 如果txRemoteOffset.roll小于250，则增加5
    if (txRemoteOffset.roll < 250)
    {
        txRemoteOffset.roll += 5;
        // 将新的roll值写入AT24C02 EEPROM
        at24c02_writePage(AT24C02ADDR_ROLL_OFFSET, (uint8_t *)&txRemoteOffset.roll, 2);
    }
}

// 按钮7的单击事件处理函数
void btn7_singleClickHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    // 如果txRemoteOffset.pitch大于-250，则减少5
    if (txRemoteOffset.pitch > -250)
    {
        txRemoteOffset.pitch -= 5;
        // 将新的pitch值写入AT24C02 EEPROM
        at24c02_writePage(AT24C02ADDR_PITCH_OFFSET, (uint8_t *)&txRemoteOffset.pitch, 2);
    }
}

// 按钮8的单击事件处理函数
void btn8_singleClickHandler(void *btn)
{
    // 设置蜂鸣器持续时间为20*5ms
    beep_setDuration(20);
    // 如果txRemoteOffset.pitch小于250，则增加5
    if (txRemoteOffset.pitch < 250)
    {
        txRemoteOffset.pitch += 5;
        // 将新的pitch值写入AT24C02 EEPROM
        at24c02_writePage(AT24C02ADDR_PITCH_OFFSET, (uint8_t *)&txRemoteOffset.pitch, 2);
    }
}

// 根据按钮ID读取按钮状态
uint8_t btn_read(uint8_t button_id)
{
    switch (button_id)
    {
    case BTN1_ID:
        return GPIO_ReadInputDataBit(BTN1_PORT, BTN1_PIN);

    case BTN2_ID:
        return GPIO_ReadInputDataBit(BTN2_PORT, BTN2_PIN);

    case BTN3_ID:
        return GPIO_ReadInputDataBit(BTN3_PORT, BTN3_PIN);

    case BTN4_ID:
        return GPIO_ReadInputDataBit(BTN4_PORT, BTN4_PIN);

    case BTN5_ID:
        return GPIO_ReadInputDataBit(BTN5_PORT, BTN5_PIN);

    case BTN6_ID:
        return GPIO_ReadInputDataBit(BTN6_PORT, BTN6_PIN);

    case BTN7_ID:
        return GPIO_ReadInputDataBit(BTN7_PORT, BTN7_PIN);

    case BTN8_ID:
        return GPIO_ReadInputDataBit(BTN8_PORT, BTN8_PIN);

    default:
        return 0;
    }
}

// 初始化所有按钮
void btn_init(void)
{
    // 使能GPIOA、GPIOB和GPIOC的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    // 配置GPIO为上拉输入模式
    GPIO_InitTypeDef GPIO_InitStructure = {
        .GPIO_Mode = GPIO_Mode_IPU,    // 上拉输入
        .GPIO_Speed = GPIO_Speed_50MHz // 50MHz
    };
    // 初始化每个按钮的GPIO引脚
    GPIO_InitStructure.GPIO_Pin = BTN1_PIN;
    GPIO_Init(BTN1_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = BTN2_PIN;
    GPIO_Init(BTN2_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = BTN3_PIN;
    GPIO_Init(BTN3_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = BTN4_PIN;
    GPIO_Init(BTN4_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = BTN5_PIN;
    GPIO_Init(BTN5_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = BTN6_PIN;
    GPIO_Init(BTN6_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = BTN7_PIN;
    GPIO_Init(BTN7_PORT, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = BTN8_PIN;
    GPIO_Init(BTN8_PORT, &GPIO_InitStructure);

    // 初始化每个按钮并绑定单击事件处理函数
    button_init(&btn1, btn_read, 0, BTN1_ID);
    button_attach(&btn1, PRESS_DOWN, btn1_pressDownHandler);
    button_attach(&btn1, PRESS_UP, btn1_pressUpHandler);
    button_start(&btn1);

    button_init(&btn2, btn_read, 0, BTN2_ID);
    button_attach(&btn2, PRESS_DOWN, btn2_pressDownHandler);
    button_attach(&btn2, PRESS_UP, btn2_pressUpHandler);
    button_start(&btn2);

    button_init(&btn3, btn_read, 0, BTN3_ID);
    button_attach(&btn3, SINGLE_CLICK, btn3_singleClickHandler);
    button_start(&btn3);

    button_init(&btn4, btn_read, 0, BTN4_ID);
    button_attach(&btn4, SINGLE_CLICK, btn4_singleClickHandler);
    button_start(&btn4);

    button_init(&btn5, btn_read, 0, BTN5_ID);
    button_attach(&btn5, SINGLE_CLICK, btn5_singleClickHandler);
    button_start(&btn5);

    button_init(&btn6, btn_read, 0, BTN6_ID);
    button_attach(&btn6, SINGLE_CLICK, btn6_singleClickHandler);
    button_start(&btn6);

    button_init(&btn7, btn_read, 0, BTN7_ID);
    button_attach(&btn7, SINGLE_CLICK, btn7_singleClickHandler);
    button_start(&btn7);

    button_init(&btn8, btn_read, 0, BTN8_ID);
    button_attach(&btn8, SINGLE_CLICK, btn8_singleClickHandler);
    button_start(&btn8);
}
